﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpModelInterface.h"
#include "IGraphicsElementShape.h"
#include "IModelView.h"

namespace gcmp
{
    class IModelView;
    class ElementId;

    /// \brief 剖切面剖切选项
    ENUM_CLASS(CutPlaneCutOption)
    {
        KeepBackground = 0,     ///< 保留背景
        KeepForeground = 1,     ///< 保留前景
        KeepBoth = 2,           ///< 保留前景与背景
        Uncuttable = 3          ///< 不剖切，保留整体
    };

    /// \brief 切平面前景Element处理器
    class GCMP_MODEL_INTERFACE_EXPORT IForegroundElementHandler
    {
    public:
        virtual ~IForegroundElementHandler();

        /// \brief 是否开启对切平面前景 Element 的面的可见性控制
        ///
        /// \param[in] modelView 视图
        /// \return true，开启；false，关闭
        virtual bool IsFaceVisibilityControlEnabled(const IModelView& modelView) const = 0;

        /// \brief 判断切平面前景 Element 的面是否可见
        ///
        /// \param[in] modelView 视图
        /// \param[in] elementId 待获取信息的 Element
        /// \return true，可见；false，不可见
        virtual bool IsFaceVisible(const IModelView& modelView, const ElementId& elementId) const = 0;

        /// \brief 获取 Element 的剖切面剖切选项
        ///
        /// \param[in] modelView 视图
        /// \param[in] elementId 待获取信息的 Element
        /// \return CutPlaneCutOption 剖切面剖切选项
        virtual CutPlaneCutOption GetCutPlaneCutOption(const IModelView& modelView, const ElementId& elementId) const = 0;

        /// \brief 自定义 ELement 的前背景信息
        ///
        /// \param[in] modelView 视图
        /// \param[in] opCurrentGrep ELement 当前的图形表达
        /// \param[in] currentElementInfo Element 当前的前背景信息
        /// \param[out] isElementCustomized 是否自定义 Element 的前背景信息
        /// \param[out] opCustomizedGrep 自定义前背景信息的 ELement 图形表达。如果为空，则使用 opCurrentGrep
        virtual void CustomizeElementForegroundOrBackgroundInfo(const IModelView& modelView, OwnerPtr<IGraphicsElementShape>& opCurrentGrep, ElementForegroundOrBackgroundInfo currentElementInfo, bool& isElementCustomized, OwnerPtr<IGraphicsElementShape>& opCustomizedGrep) const = 0;
    
        /// \brief 判断前景是否可见。如果 ELement 的部分节点为前景，则此可见性控制只针对 Element 的前景节点
        ///
        /// \param[in] modelView 视图
        /// \param[in] elementId 待获取信息的 Element
        /// \return true，可见；false，不可见
        virtual bool IsForegroundVisible(const IModelView& modelView, const ElementId& elementId) const = 0;
    
    };
}